package oo.day04;

public class OverrideDemo {

	public static void main(String[] args) {
		 Goo goo = new Goo();
		 Eoo o = new Foo();  //造型
		 goo.test(o);    //打印父类参数,子类show
	}

}

class Goo{
	void test(Eoo o) {
		System.out.println("父类参数");
		o.show();
	}
	void test(Foo o) {
		System.out.println("子类参数");
		o.show();
	}
}

class Eoo{
	void show() {System.out.println("父类show");}
}
class Foo extends Eoo{
	void show() {System.out.println("子类show");}
}

/*重写需要遵循"两同两小一大"原则:一般都是一模一样的
 * 1.两同
 *		1)方法名称相同
 *		2)参数列表相同
 * 2.两小:
 * 		1)子类方法的返回值类型小于或等于父类
 * 			1.1)void和基本类型时，必须相同
 * 			1.2)引用类型时，小于或等于
 * 		2)子类方法抛出的异常小于或等于父类的
 * 3.一大:
 * 		1)子类方法的访问权限大于或等于父类的-----访问修饰符
 * 
 * 重载与重写的区别：
 * 重写：发生在父子类中，方法名相同，参数列表相同，方法体不同
 * 		遵循"运行期"绑定，根据对象的类型调用不同的方法
 * 重载: 发生在一个类中，方法名相同，参数列表不同，方法体不同
 * 		遵循"编译期"绑定，根据引用的类型绑定不同的方法
 * 重写看对象，重载看引用
 */

//class Aoo{
//	void say() {}
//	double salary() {return 3000.0;}
//	Boo b = new Boo();
//}
//
//class Boo extends Aoo{
//	void say() {}
//	double salary() {return 2000.00;}
//	int salary() {return 2000.00;} //基本类型必须相同，否则编译错误
//	Boo b = new Boo();
//	Coo b = new Boo();  引用类型时，要小于或等于父类，父类大，子类小
//}
